
/*******************************************************************************
 * Copyright (c) 2012, 2017 IBM Corp.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Eclipse Distribution License v1.0 which accompany this distribution. 
 *
 * The Eclipse Public License is available at 
 *   http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 *   http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *    Ian Craggs - initial contribution
 *******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "MQTTClient.h"
#include "cJSON.h"
#define ADDRESS     "d21ddf1880.st1.iotda-device.cn-north-4.myhuaweicloud.com"
#define CLIENTID    "ExampleClientPub"
#define TOPIC       "$oc/devices/68c7ce8232771f177b606477_ai999/sys/messages/down"
#define PAYLOAD     "Hello World!"
#define QOS         1
#define TIMEOUT     10000L

volatile MQTTClient_deliveryToken deliveredtoken;

void delivered(void *context, MQTTClient_deliveryToken dt)
{
    printf("Message with token value %d delivery confirmed\n", dt);
    deliveredtoken = dt;
}

int msgarrvd(void *context, char *topicName, int topicLen, MQTTClient_message *message)
{
    int i;
    char* payloadptr;

    printf("Message arrived\n");
    printf("     topic: %s\n", topicName);
    printf("   message: \n");

   
    cJSON *root=cJSON_Parse(message->payload);
    cJSON *item=cJSON_GetObjectItem(root,"name");
    printf("name:%s\n",item->valuestring);
    item=cJSON_GetObjectItem(root,"age");
    printf("age:%d\n",item->valueint);
    item=cJSON_GetObjectItem(root,"msg");
    printf("msg:%s\n",item->valuestring);


    ////////////////////////
    MQTTClient_freeMessage(&message);
    MQTTClient_free(topicName);
    return 1;
}

void connlost(void *context, char *cause)
{
    printf("\nConnection lost\n");
    printf("cause: %s\n", cause);
}
int main(int argc, char* argv[])
{
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;

    MQTTClient_message pubmsg = MQTTClient_message_initializer;
    MQTTClient_deliveryToken token;


    int rc;
    int ch;

    MQTTClient_create(&client, ADDRESS, CLIENTID,
        MQTTCLIENT_PERSISTENCE_NONE, NULL);
    conn_opts.keepAliveInterval = 60;
    conn_opts.cleansession = 1;

    MQTTClient_setCallbacks(client, NULL, connlost, msgarrvd, delivered);

    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }

    printf("Subscribing to topic %s\nfor client %s using QoS%d\n\n"
           "Press Q<Enter> to quit\n\n", TOPIC, CLIENTID, QOS);
    MQTTClient_subscribe(client, TOPIC, QOS);

    do 
    {
        printf("ch:");
        ch = getchar();
        if(ch!='q'&&ch!='Q')
        {   
            char buf1[32]={};
            int buf2=0;
            char buf3[32]={};
            printf("name:");
            scanf("%s",buf1);
            getchar();
            printf("age:");
            scanf("%d",&buf2);
            printf("msg:");
            scanf("%s",buf3);
            getchar();
            cJSON *root=cJSON_CreateObject();
            cJSON *item=cJSON_CreateString(buf1);
            cJSON_AddItemToObject(root,"name",item);
            item=cJSON_CreateNumber(buf2);
            cJSON_AddItemToObject(root,"age",item);
            item=cJSON_CreateString(buf3);
            cJSON_AddItemToObject(root,"msg",item);
            char *buf =cJSON_Print(root);
            pubmsg.payload = buf;
            pubmsg.payloadlen = (int)strlen(buf);
            pubmsg.qos = QOS;
            pubmsg.retained = 0; 
            MQTTClient_publishMessage(client, "up", &pubmsg, &token);
            printf("Waiting for up to %d seconds for publication of %s\n"
            "on topic %s for client with ClientID: %s\n",
            (int)(TIMEOUT/1000), buf, "up", CLIENTID);
            rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
            printf("Message with delivery token %d delivered\n", token);
        }
    } while(ch!='Q' && ch != 'q');

    MQTTClient_unsubscribe(client, TOPIC);
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}






    
   

   
    